# 给定一个包含 [0, n] 中 n 个数的数组 nums ，找出 [0, n] 这个范围内没有出现在数组中的那个数。
#
#  示例 1：
# 输入：nums = [3,0,1]
# 输出：2
# 解释：n = 3，因为有 3 个数字，所以所有的数字都在范围 [0,3] 内。2 是丢失的数字，因为它没有出现在 nums 中。
#
#  示例 2：
# 输入：nums = [0,1]
# 输出：2
# 解释：n = 2，因为有 2 个数字，所以所有的数字都在范围 [0,2] 内。2 是丢失的数字，因为它没有出现在 nums 中。
#
#  示例 3：
# 输入：nums = [9,6,4,2,3,5,7,0,1]
# 输出：8
# 解释：n = 9，因为有 9 个数字，所以所有的数字都在范围 [0,9] 内。8 是丢失的数字，因为它没有出现在 nums 中。
#
#  示例 4：
# 输入：nums = [0]
# 输出：1
# 解释：n = 1，因为有 1 个数字，所以所有的数字都在范围 [0,1] 内。1 是丢失的数字，因为它没有出现在 nums 中。
#  进阶：你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?
from typing import List


class Solution:
    def missingNumber2(self, nums: List[int]) -> int:
        """
        数学方法：用 1到n的和减去数组所有元素之和返回即可
        :param nums:
        :return:
        """
        n = len(nums)
        return n * (n + 1) // 2 - sum(nums)

    def missingNumber1(self, nums: List[int]) -> int:
        """
        哈希表
        :param nums:
        :return:
        """
        s = set(nums)
        for i in range(len(nums) + 1):
            if i not in s:
                return i
        return len(nums)

    def missingNumber(self, nums: List[int]) -> int:
        return self.missingNumber2(nums)


if __name__ == "__main__":
    nums = [9, 6, 4, 2, 3, 5, 7, 0, 1]
    print(Solution().missingNumber(nums))
